import os
import json


class Config:
    """
    用于从 config.json 文件中读取配置项的类
    """

    def __init__(self, config_file='config.json'):
        self.config_file = config_file
        self.config_data = self._load_config()

    def _load_config(self):
        """加载配置文件"""
        if not os.path.exists(self.config_file):
            raise FileNotFoundError(f"配置文件 {self.config_file} 未找到")

        try:
            with open(self.config_file, 'r', encoding='utf-8') as f:
                return json.load(f)
        except json.JSONDecodeError as e:
            raise ValueError(f"配置文件格式错误: {e}")

    def get(self, key:str, default=None):
        """
        获取指定的配置值

        :param key: 要获取的键名 (str)
        :param default: 如果键不存在时返回的默认值
        :return: 配置值或默认值
        """
        return self.config_data.get(key, default)

    def get_required(self, key: str):
        """
        获取必须存在的配置值，如果不存在则抛出 KeyError

        :param key: 要获取的键名 (str)
        :return: 配置值
        :raises: KeyError 如果键不存在
        """
        value = self.config_data.get(key)
        if value is None:
            raise KeyError(f"缺少必要配置项: {key}")
        return value


if __name__ == '__main__':
    # 单例模式：直接加载默认配置文件
    config = Config()
